﻿; ----------------------------------------------------------------------------------------------------------------------
; Name ..........: dasung_ahk  大上客户端快捷键
; Description ...: 提供控制大上paperlike显示器客户端的快捷键。
;                  例如通过快捷键显示隐藏客户端、快速刷新、快速调节显示模式
; AHK Version ...: AHK_L 1.1.34.03 x32/64 Unicode
; Author ........: wgs
; Version Date ..: 2022.7.24
; ----------------------------------------------------------------------------------------------------------------------

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#Warn  ; Enable warnings to assist with detecting common errors.
#SingleInstance, force  ; Allow only one instance of this script to be running.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

SetTitleMatchMode, RegEx
DetectHiddenWindows, On

global clientTitle := "Paperlike 客户端"
global clientPath := "C:\Program Files (x86)\Paper Like Monitor\DSPaperLikeClient.exe"


; ================== 初始化 ==================

If !WinExist(clientTitle) {
  RunClient()
}

; ================ 快捷键配置 ================

; 启动/激活/隐藏 客户端 -- Ctrl + Alt + E
^!e::ToggelClient()

; 使用`(数字1左侧的按键)作为快捷键修饰键。
`::` ; 不用做修饰键时，保持原功能

; 快速刷新
; - 按第一次，用黑屏来刷掉白色背景里的残影
; - 按第二次，用白屏来刷掉黑色背景里的残影
` & f::FastRefresh()

#IfWinExist, Paperlike 客户端

; 全局刷新
` & g::ControlClick, Button2

; 调节对比度
` & 1::
` & 2::
` & 3::
` & 4::
` & 5::
` & 6::
` & 7::
` & 8::
` & 9::ConfigureEink(SubStr(A_ThisHotkey, 0)) ; 对比度设为 1~9
` & =::ConfigureEink("+") ; 对比度递增
` & -::ConfigureEink("-") ; 对比度递减

; 修改画质模式
` & a::ConfigureEink({mode:1}*) ; 文本模式
` & s::ConfigureEink({mode:2}*) ; 图文模式
` & d::ConfigureEink({mode:3}*) ; 视频模式

; 调节亮度
` & z::ConfigureEink({light:4}*) ; 关闭灯光
` & x::ConfigureEink({brightness:40}*) ; 亮度 40%
` & c::ConfigureEink({brightness:30}*) ; 亮度 30%
` & v::ConfigureEink({brightness:20}*) ; 亮度 20%
` & b::ConfigureEink({brightness:10}*) ; 亮度 10%
` & n::ConfigureEink({brightness:5}*) ; 亮度 5%
` & .::ConfigureEink({brightness:"+"}*) ; 亮度递增
` & ,::ConfigureEink({brightness:"-"}*) ; 亮度递减

; 自定义模式组合
` & q::ConfigureEink({mode:1, contrast:1}*) ; 文本模式，对比度：1
` & w::ConfigureEink({mode:1, contrast:2}*) ; 文本模式，对比度：2
` & e::ConfigureEink({mode:2, contrast:3}*) ; 图文模式，对比度：3
` & r::ConfigureEink({mode:3, contrast:1}*) ; 视频模式，对比度：1

#IfWinExist

; 客户端界面中，按esc隐藏到托盘，而不是默认的直接退出
#IfWinActive, Paperlike 客户端
  esc::HideClient()
#IfWinActive


; =============== 功能函数 ================

; 启动客户端
RunClient(show:=False) {
  Gui, Hint:New, -Caption
  Gui, Font, s12, 微软雅黑
  Gui, Add, Text, , Paperlike 客户端启动中...
  Gui, Show, Center

  Run, %clientPath%
  WinWaitActive, %clientTitle%, , 15
  Gui, Destroy

  ; 隐藏界面
  If !show {
    Sleep, 500
    HideClient()
  }

  ; 调整位置，避免挡住屏幕中间
  WinGetPos, , , w, h
  WinMove, , , % A_ScreenWidth*4/5-w/2, % A_ScreenHeight/2-h/2
}


; 隐藏客户端
HideClient() {
  ; 通过点击“确认”按钮隐藏。避免使用WinHide造成无法重新显示的问题
  ControlClick, Button3, %clientTitle%
}


; 启动/激活/隐藏 客户端
ToggelClient() {
  ; 若为激活状态，隐藏界面
  If WinActive(clientTitle) {
    HideClient()
  }
  ; 若后台运行，激活界面
  Else If WinExist(clientTitle) {
    WinShow
    WinActivate
  }
  ; 启动客户端
  Else {
    RunClient(True)
  }
}


; 快速刷新
; - 第一次，用黑屏来刷掉白色背景里的残影
; - 第二次，用白屏来刷掉黑色背景里的残影
FastRefresh() {
  static lastRefreshTick := 0 ; 快速刷新时间戳
  refreshInterval := 2000 ; 快速刷新时间间隔

  Gui +AlwaysOnTop -Caption

  If (A_TickCount - lastRefreshTick > refreshInterval) {
    Gui, Color, 000000 ; 刷新间隔后第一次刷新，使用黑屏
    lastRefreshTick := A_TickCount
  }
  Else {
    Gui, Color, FFFFFF ; 刷新间隔内第二次刷新，使用白屏
  }

  Gui, Show, x0 y0 h%A_ScreenHeight% w%A_ScreenWidth%
  Sleep 150
  Gui, Hide
}


; 一次性设置墨水屏的六项配置
; - 每个配置项的值可为 空、数字、加减号
ConfigureEink(contrast:="", mode:="", speed:="", light:="", cct:="", brightness:="") {
  If mode and mode != GetValue("ComboBox2") {
    SetControlValue("ComboBox2", mode)
    Sleep 500
  }
  If speed
    SetControlValue("ComboBox3", speed)
  If contrast
    SetControlValue("ComboBox1", contrast)
  If light
    SetControlValue("ComboBox5", light)
  If (cct != "")
    SetControlValue("msctls_trackbar321", cct)
  If (brightness != "")
    SetControlValue("msctls_trackbar322", brightness)
}

; 设置控件的值
; - value可为数字或加减号
SetControlValue(control, value) {
  ; 下拉框类控件
  If InStr(control, "ComboBox") == 1 {
    If value in +,-
      ControlSend, %control%, % value == "+" ? "{Down}" : "{Up}"
    Else
      Control, Choose, %value%, %control%
  }
  ; 滑动条类控件。需要先开灯且显示界面才可调节
  Else If InStr(control, "msctls_trackbar32") == 1 {
    activeBefore := WinActive(clientTitle)
    WinShow
    If value in +,- 
    {
      LightUp()
      ; 亮度加减 10%
      SendMessage, 0x0400, 0, 0, %control%
      oldVal := ErrorLevel<<32>>32
      newVal := oldVal + (value == "+" ? 10 : -10)
      If newVal > 100
        newVal := 100
      Else If newVal < 0
        newVal := 0
      PostMessage, 0x0405, 1, newVal, %control%
    }
    Else {
      If (value > 0) {
        LightUp()
      }
      ; 设置滑块位置 TBM_SETPOS 0x0405
      PostMessage, 0x0405, 1, value, %control%
    }
    If not activeBefore
      SetTimer, HideClient, -1000
  }
}

; 获取控件的值
GetValue(control) {
  If InStr(control, "ComboBox") == 1 {
    ; 下拉列表取值消息 CB_GETCURSEL 0x0147
    SendMessage, 0x0147, 0, 0, %control%
    return (ErrorLevel<<32>>32) + 1 ; 转换为32位。序号从1开始
  }
  If InStr(control, "msctls_trackbar32") == 1 {
    ; 滑动条取值消息 TBM_GETPOS 0x0400
    SendMessage, 0x0400, 0, 0, %control%
    return ErrorLevel<<32>>32 ; 转换为32位
  }
  return 0
}

; 开灯
LightUp() {
  ControlGet, lighted, Enabled,, msctls_trackbar322
  if (!lighted) {
    Control, Choose, 1, ComboBox5
  }
}

; ============================
